﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using DLULearningNetwork.Libs;
using DLULearningNetworkModel;
using DLULearningNetwork.ActionFilterAttributes;
using System.Text.RegularExpressions;

namespace DLULearningNetwork.Controllers
{

    public class AccountController : Controller
    {
        public ActionResult Index()
        {
            return RedirectToAction("Login");
        }

        public string Register(string firstName, string lastName, string nickName, string email, string confirmEmail, string sex, string password,
            string confirmPassword, string securityQuestionID, string answer, int day, int month, int year, string code)
        {

            try
            {
                if (StringHelper.IsEmpty(firstName) || StringHelper.IsEmpty(lastName) || StringHelper.IsEmpty(nickName) || StringHelper.IsEmpty(email)
                    || StringHelper.IsEmpty(password) || StringHelper.IsEmpty(answer))
                {
                    return "Bạn phải điền tất cả các trường.";
                }

                Regex re = new Regex(@"^[a-z][a-z1-9_]{5,19}");
                if (!re.IsMatch(nickName.ToLower()))
                {
                    return "nickname phải từ 6-25 kí tự, bắt đầu bằng kí tự, không phân biệt chữ hoa, không khoảng trắng, chỉ gồm chữ cái, số và kí tự '_'";
                }

                if (password.Length < 8 || password.Length > 16)
                {
                    return "Mật khẩu phải có từ 8 đến 16 ký tự.";
                }

                if (!StringHelper.IsEmail(email))
                {
                    return "Email không hợp lệ.";
                }


                if (email.CompareTo(confirmEmail) != 0)
                {
                    return "Email của bạn không khớp. Vui lòng thử lại.";
                }

                if (password.CompareTo(confirmPassword) != 0)
                {
                    return "Password của bạn không khớp. Vui lòng thử lại.";
                }

                if (securityQuestionID == "0")
                {
                    return "Vui lòng chọn câu hỏi bí mật.";
                }

                if (sex == "0")
                {
                    return "Vui lòng chọn Nam hoặc Nữ.";
                }

                if (day == 0 || month == 0 || year == 0)
                {
                    return "Bạn phải chỉ rõ ngày sinh đầy đủ của mình để đăng ký.";
                }
                //Ma so sinh vien hoac giang vien co hop le khong, la code
                IDNumber idNumber = IDNumber.SelectByCode(code);
                if (idNumber == null || idNumber.IsUse_b == true)
                {
                    return "Hệ thống không có mã số này, hoặc đã được sử dụng liên hệ với nhà quản trị để đăng kí";
                }

                Account account = new Account();
                account.AccountID_u = Guid.NewGuid();
                account.FirstName_s = firstName.Trim();
                account.LastName_s = lastName.Trim();
                account.Nickname_s = nickName.Trim();
                account.Email_s = email.Trim();
                account.Sex_b = sex.CompareTo("Male") == 0 ? true : false;
                account.DateOfBirth_dt = new DateTime(year, month, day);
                account.Password_s = StringHelper.EncodeMD5(password);
                account.SecurityQuestionID_u = Guid.Parse(securityQuestionID);
                account.Answer_s = answer;
                account.Avatar_s = "/Content/Images/avatar.gif";
                account.IDNumberID_i = idNumber.IDNumberID_i;
                int result = Account.Add(account);
                if (result == 1)
                {
                    //tao profile cho account nay
                    Profile profile = Profile.AddProfileForAccountID(account.AccountID_u);
                    //tao cac chinh sach rieng tu mac dinh
                    PrivacyFlag.CreatePrivacyFlagDefault(profile.ProfileID_u);
                    return "0"; // Register successful
                }
                else if (result == 0)
                {
                    return "Có lỗi xảy ra, vui lòng thử lại.";
                }
                else if (result == -1)
                {
                    return "Email này đã được sử dụng, vui lòng nhập lại email khác.";
                }
                else if (result == 2)
                {
                    return "Nickname này đã được sử dụng, vui lòng chọn nickname khác";
                }

                return "";
            }
            catch
            {
                return "Có lỗi kết trong quá trình đăng kí.\n Vui lòng thử lại sau";
            }
        }

        public ActionResult Login()
        {
            Account acc;
            if ((acc = LibSession.Get(Constants.ACCOUNT_LOGIN) as Account) != null)
            {
                if (acc.IsBanned_b != null && acc.IsBanned_b == true)
                {
                    return PartialView("ErrorMessage", "Tài khoản này đã bị cấm sử dụng, liên hệ với nhà quản trị để biết thêm thông tin");
                }
                
                return RedirectToAction("HomePage", "Home");
            }
            else
            {
                string email = LibCookie.Get(Constants.EMAIL_LOGIN);
                string password = LibCookie.Get(Constants.PASSWORD_LOGIN);
                acc = Account.Single(email, StringHelper.EncodeMD5(password));

                if (acc != null)
                {
                    if (acc.IsBanned_b == true)
                    {
                        return PartialView("ErrorMessage", "Tài khoản này đã bị cấm sử dụng, liên hệ với nhà quản trị để biết thêm thông tin");
                    }
                    LibSession.Set(Constants.ACCOUNT_LOGIN, acc);
                    return RedirectToAction("HomePage", "Home");
                }
            }

            return View();
        }

        public ActionResult LogOut()
        {
            LibCookie.Remove(Constants.EMAIL_LOGIN);
            LibCookie.Remove(Constants.PASSWORD_LOGIN);
            LibSession.Remove(Constants.ACCOUNT_LOGIN);
            return RedirectToAction("Login");
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Login(FormCollection frm)
        {
            string email = frm["Email_Login"];
            string password = frm["Password_Login"];
            Account acc = Account.Single(email, StringHelper.EncodeMD5(password));
            if (acc == null)
            {
                ViewBag.LoginErrorMessage = "Email hoặc mật khẩu không chính xác.";
                return View();
            }
            if (acc.IsBanned_b != null && acc.IsBanned_b == true)
            {
                return PartialView("ErrorMessage", "Tài khoản này đã bị cấm sử dụng, liên hệ với nhà quản trị để biết thêm thông tin");
            }
            LibSession.Set(Constants.ACCOUNT_LOGIN, acc);
            if (frm["KeepLogin"] != null)
            {
                LibCookie.Add(Constants.EMAIL_LOGIN, email, DateTime.Now.AddDays(20));
                LibCookie.Add(Constants.PASSWORD_LOGIN, password, DateTime.Now.AddDays(20));
            }

            return RedirectToAction("HomePage", "Home");
        }

        public ActionResult Recover()
        {
            return View();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Recover(FormCollection frm)
        {
            string email = frm["Email_Login"];
            string securityQuestionID = frm["SecurityQuestion"];
            if (securityQuestionID == "0")
            {
                ViewBag.RecoverErrorMessage = "Vui lòng chọn câu hỏi bí mật.";
                return View();
            }

            string answer = frm["Answer"];
            Account account = Account.Single(email, Guid.Parse(securityQuestionID), answer);
            if (account == null)
            {
                ViewBag.RecoverErrorMessage = "Email hoặc câu hỏi bí mật và câu trả lời chưa chính xác.";
                return View();
            }

            string newPassword = StringHelper.GenerateRandomString(8);
            account.Password_s = StringHelper.EncodeMD5(newPassword);
            int result = Account.Update(account);
            if (result == -1)
            {
                ViewBag.RecoverErrorMessage = "Tài khoản này không tồn tại.";
            }
            else if (result == 0)
            {
                ViewBag.RecoverErrorMessage = "Có lỗi xảy ra, vui lòng thử lại.";
            }
            else
            {
                string body = "Mật khẩu mới của bạn là: " + newPassword;
                string header = "Dalat University Learning Network - Khôi phục mật khẩu";
                if (EmailHelper.SendMail(email, header, body))
                {
                    ViewBag.RecoverErrorMessage = "0";
                }
                else
                {
                    ViewBag.RecoverErrorMessage = "Có lỗi xảy ra, vui lòng thử lại";
                }
            }

            return View();
        }

        [RequireUserLogin()]
        public ActionResult ChangePassword()
        {
            return View();
        }

        [RequireUserLogin()]
        [HttpPost]
        public ActionResult ChangePassword(FormCollection formCollection)
        {
            //Undone: do dai password
            string oldPassword = formCollection["oldPassword"];
            string newPassword = formCollection["newPassword"];
            string repeatPassword = formCollection["repeatPassword"];
            Account currentUser = RequireUserLogin.LoginUser;
            if (newPassword == repeatPassword)
            {
                oldPassword = StringHelper.EncodeMD5(oldPassword);
                if (oldPassword == currentUser.Password_s)
                {
                    //Cap nhat
                    currentUser.Password_s = StringHelper.EncodeMD5(newPassword);
                    if (Account.Update(currentUser) == 1)
                    {
                        ViewBag.Success = true;
                    }
                }
            }
            return View();
        }

    }
}
